export default class QRCodeGenerator {
    constructor(text, options = {}) {
        this.text = text,
            this.version = options.version || 1;    // QR版本(1-40)
        this.errorLevel = options.errorLevel || 'M';    // 纠错等级L/M/Q/H
        this.moduleSize = options.moduleSize || 4;      // 每个模块的像素
        this.margin = options.margin || 4;              // 边距(模块数)
    }

    // 主生成方法
    generate(type = 'svg') {
        const matrix = this._createMatrix();
        return type === 'svg' ? this._toSVG(matrix) : this._toBase64(matrix);
    }

    // 创建二维码矩阵
    _createMatrix() {
        // 1.数据编码
        const encoded = this._encodeData();

        // 2.初始化矩阵
        const size = this.version * 4 + 17;
        const matrix = Array(size).fill().map(() => Array(size).fill(0));//记

        // 3.填充定位图案
        this._addFinderPatterns(matrix)

        // 4.填充数据（简化版）
        this._fillData(matrix, encoded);

        return matrix;
    }

    // 数据编码（简化版）
    _encodeData() {
        // 这里实现简化的UTF-8编码
        const bytes = new TextEncoder().encode(this.text);
        let binary = "";
        for (let byte of bytes) {
            binary += byte.toString(2).padStart(8, '0');
        }
        return binary;
    }

    // 添加定位图案（三个大正方形）
    _addFinderPatterns(matrix) {
        const size = matrix.length;
        const pattern = [
            [1, 1, 1, 1, 1, 1, 1],
            [1, 0, 0, 0, 0, 0, 1],
            [1, 0, 1, 1, 1, 0, 1],
            [1, 0, 1, 1, 1, 0, 1],
            [1, 0, 1, 1, 1, 0, 1],
            [1, 0, 0, 0, 0, 0, 1],
            [1, 1, 1, 1, 1, 1, 1],
        ];

        // 左上角
        this._copyPattern(matrix, 0, 0, pattern);
        // 右上角
        this._copyPattern(matrix, 0, size - 7, pattern);
        // 左下角
        this._copyPattern(matrix, size - 7, 0, pattern);
    }

    // 复制图案到矩阵
    _copyPattern(matrix, x, y, pattern) {
        for (let i = 0; i < 7; i++) {
            for (let j = 0; j < 7; j++) {
                matrix[y + i][x + j] = pattern[i][j];
            }
        }
    }

    // 填充数据（简化版）
    _fillData(matrix, binary) {
        let index = 0;
        const size = matrix.length;

        // 简单按行填充（实际需要更复杂的填充规则）
        for (let y = 0; y < size; y++) {
            for (let x = 0; x < size; x++) {
                if (matrix[y][x] === 0 && index < binary.length) {
                    matrix[y][x] = binary[index] === '1' ? 1 : 0;
                    index++
                }
            }
        }

    }
    // 转换为SVG
    _toSVG(matrix) {
        const size = matrix.length;
        const svgSize = size * this.moduleSize;
        const margin = this.margin * this.moduleSize;

        let svg = `<svg width="${svgSize}" height="${svgSize}" viewBox="0 0 ${size} ${size}">`;

        for (let y = 0; y < size; y++) {
            for (let x = 0; x < size; x++) {
                if (matrix[y][x]) {
                    svg += `<rect
                        x="${x * this.moduleSize + margin}"
                        y="${y * this.moduleSize + margin}"
                        width="${this.moduleSize}"
                        height="${this.moduleSize}"
                        fill="black"/>`;
                }
            }
        }

        return svg + '</svg>';
    }

    // 转换为Base64
    _toBase64(matrix) {
        const svg = this._toSVG(matrix);
        return `data:image/svg+xml;base64,${btoa(svg)}`;
    }
}

// 使用示例
// const qr = new QRCodeGenerator('https://11111.1111.com', {
//     version: 2,
//     errorLevel: "H",
//     moduleSize: 4,
//     margin: 4,
// });
// 生成SVG
// console.log(qr.generate('svg'));
// 生成Base64
// console.log(qr.generate('base64'));